package main

import (
	"encoding/json"
	"fmt"
	"log"
)

//这里对应的 N 和 A 不能为小写，首字母必须为大写，这样才可对外提供访问，具体 json 匹配是通过后面的 tag 标签进行匹配的，与 N 和 A 没有关系
//tag 标签中 json 后面跟着的是字段名称，都是字符串类型，要求必须加上双引号，否则 golang 是无法识别它的类型
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

// json  标签使用
func main() {
	jsonStr := []byte(` {
        "NaMe":"liangyongxing",
        "agE":12
    }`)
	var person Person
	json.Unmarshal([]byte(jsonStr), &person)

	// 数据格式
	log.Println(fmt.Sprintf("person 数据结构输出: %v", person))
	log.Println(fmt.Sprintf("person 数据结构输出: %#v", person))
	log.Println(fmt.Sprintf("person 数据结构输出: %T", person))

	jsonStr = []byte(`{
	"test": {
		"array": [1, "2", 3],
		"int": 10,
		"float": 5.150,
		"bignum": 9223372036854775807,
		"string": "simplejson",
		"bool": true
	}
}`)
	// json 转 map
	var mapResult map[string]interface{}
	if err := json.Unmarshal([]byte(jsonStr), &mapResult); err != nil {
		log.Fatal(err)
	}
	for k, v := range mapResult {
		fmt.Println(fmt.Sprintf("k:%#v,v:%#v", k, v))
	}
	fmt.Println("====>")
	test := mapResult["test"].(map[string]interface{})
	fmt.Println(fmt.Sprintf("%T", test["array"]))
	fmt.Println(fmt.Sprintf("%T", test["int"]))
	fmt.Println(fmt.Sprintf("%T", test["float"]))
	fmt.Println(fmt.Sprintf("%T", test["bignum"]))
	fmt.Println(fmt.Sprintf("%T", test["string"]))
	fmt.Println(fmt.Sprintf("%T", test["bool"]))
}
